#!/bin/bash

# 卡系统测试平台健康检查脚本
# 用于检查后端服务是否正常运行

# 配置
HOST="127.0.0.1"
PORT=8116
ENDPOINT="/api/health"
URL="http://${HOST}:${PORT}${ENDPOINT}"
APP_DIR="$(cd "$(dirname "$0")" && pwd)"
LOG_DIR="${APP_DIR}/logs"
PID_FILE="${APP_DIR}/.pid"

echo "正在检查卡系统测试平台后端服务状态..."

# 检查进程是否存在
check_process() {
    # 检查PID文件
    if [ -f "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if ps -p ${PID} > /dev/null; then
            echo "✅ 进程正在运行 (PID: ${PID})"
            return 0
        else
            echo "❌ PID文件存在但进程不存在"
        fi
    fi

    # 检查gunicorn进程
    GUNICORN_PIDS=$(pgrep -f "gunicorn.*app.main:app")
    if [ ! -z "${GUNICORN_PIDS}" ]; then
        echo "✅ Gunicorn进程正在运行 (PIDs: ${GUNICORN_PIDS})"
        return 0
    fi

    # 检查uvicorn进程
    UVICORN_PIDS=$(pgrep -f "uvicorn.*app.main:app")
    if [ ! -z "${UVICORN_PIDS}" ]; then
        echo "✅ Uvicorn进程正在运行 (PIDs: ${UVICORN_PIDS})"
        return 0
    fi

    echo "❌ 未发现任何运行中的服务进程"
    return 1
}

# 检查API是否可访问
check_api() {
    echo "正在检查API可用性..."
    if curl -s -o /dev/null -w "%{http_code}" ${URL} | grep -q "200"; then
        echo "✅ API健康检查通过"
        return 0
    else
        echo "❌ API健康检查失败"
        return 1
    fi
}

# 检查日志文件
check_logs() {
    echo "正在检查日志文件..."
    
    # 检查日志目录是否存在
    if [ ! -d "${LOG_DIR}" ]; then
        echo "❌ 日志目录不存在"
        return 1
    fi
    
    # 检查最近的错误日志
    RECENT_ERRORS=$(find ${LOG_DIR} -type f -name "*.log" -mtime -1 -exec grep -l "ERROR" {} \;)
    if [ ! -z "${RECENT_ERRORS}" ]; then
        echo "⚠️ 发现最近的错误日志:"
        for log in ${RECENT_ERRORS}; do
            echo "  - ${log}"
            tail -n 5 ${log} | sed 's/^/    /'
        done
    else
        echo "✅ 未发现最近的错误日志"
    fi
}

# 执行所有检查
check_process
PROCESS_STATUS=$?

check_api
API_STATUS=$?

check_logs
LOG_STATUS=$?

# 总结
echo ""
echo "健康检查总结:"
if [ ${PROCESS_STATUS} -eq 0 ] && [ ${API_STATUS} -eq 0 ]; then
    echo "✅ 服务状态: 正常运行"
    exit 0
elif [ ${PROCESS_STATUS} -eq 0 ] && [ ${API_STATUS} -ne 0 ]; then
    echo "⚠️ 服务状态: 进程运行但API不可访问"
    exit 1
else
    echo "❌ 服务状态: 未运行"
    exit 2
fi 